应用实践 | 10 亿数据秒级关联,货拉拉基于 Apache Doris 的 OLAP 体系演进(附 PPT 下载)
关注「SelectDB」第一时间获取更多资讯!
导读:本文是货拉拉大数据引擎负责人杨秋吉 &张斌在 DataFunSummit 2022 多维分析架构峰会上的演讲分享,分享的主题是《货拉拉基于 Apache Doris 的 OLAP 体系演进及建设方法》,详细讲解了货拉拉从 OLAP1.0 到 3.0 的演进过程,其中不乏有值得借鉴的方法论以及深刻的技术思考,希望能对大家有所帮助。
分享人|货拉拉大数据引擎负责人 杨秋吉&张斌
业务背景
货拉拉大数据体系为支撑公司业务,现在已经成立三个 IDC 集群、拥有上千台规模的机器数量,存储量达到了 20PB、日均任务数达到了 20k 以上,并且还处在快速增长的过程中。
大数据体系
货拉拉大数据体系从下往上分为 5 层,最下面的是基础层和接入层,这两层主要会提供基础数据的存储、计算以及集群的管理功能。在基础层和接入层之上是平台层和数仓。在平台层之中包含了数据研发平台和数据治理平台,基于平台层的能力和数据仓库的数据体系,在这之上面包含了含有业务属性的服务层和应用层。整个体系自下而上相互支持,实现支持业务和赋能业务的能力。
实时采集比较典型的场景为用户端上埋点会直接同步到大数据平台做存储,供后续的在线和离线计算使用。 离线的数据主要是来自于业务方的数据库,会通过天或者是小时定期采集到大数据存储中,以供后续使用。
中间是数据的存储和计算阶段。在离线场景中会通过对数据 ETL 之后转换为构造数仓的分层体系。实时比较典型的场景为数据在经过 Flink 的处理后会直接落在线存储系统,类似于 HBase 和 OLAP 等等,为后续的业务系统提供数据服务。
OLAP 演进概览
货拉拉从 2021 年开始进行 OLAP 的技术研究,截至目前已经经历 3 个阶段:
2021 年上半年为货拉拉的 OLAP1.0 阶段,这个阶段我们主要是支持公司的罗盘业务,我们引入的是能够提供较好的单表依据和查询能力的 Apache Druid 引擎。 2021 年下半年为货拉拉的 OLAP2.0 阶段,我们支持了智能定位工具,这个阶段引入了够提供单表明细查询,并且还有较高的压缩率 ClickHouse。 今年为货拉拉的 OLAP3.0 阶段,伴随着公司业务需求的不断增多,我们也会需要用到多数据源的关联分析。基于此,由于 Apache Doris 具备大表关联分析的能力,我们引入了 Apache Doris 引擎。
OLAP1.0 孕育期
根据该图可以看到业务的数据通过实时和离线处理之后会落在 MySQL,MySQL 之中储存了维度聚合之后的结果数据,这也意味着会在 Flink 之中做大量的聚合分析,根据业务需要的相应维度所做的一系列组合都是在Flink之中做实时聚合,最后将结果储存到 MySQL。
存在的问题:
存在存储瓶颈,类似于 Kylin 之中的维度爆炸的问题。 开发成本、高效率低。当业务侧需要新增维度的时候会需要对 Flink 中的所有作业都做一定的修改,然后再重新上线。 无法支持部分聚合需求。
对于存在的这些问题,我们经过分析之后,总结出了 3 个背后存在的需求点:
业务侧希望能够横向扩容,解决存储瓶颈。 希望能够自由组合维度做分析,提升业务侧开发效率。 希望能够支持任意维度实现跨度的分析。
>>> 解决方案
技术调研
原因是 Druid 除了能够满足我们的业务需求之外,还有一个比较重要的影响因素是 Druid 引擎是纯 Java 开发,与我们的技术栈比较吻合,可控性更高。
POC 阶段
功能验证。在功能验证中,我们会收集业务侧的 SQL,之后提取 SQL Pattern,然后再根据 Druid 引擎的 Rollup 语义做 SQL 的改写,涉及到大量 UDF 的改写、Rollup 语义兼容以及 Count Distinct 语义兼容等等。 性能验证。我们会直接采用业务真实的数据和业务真实的 SQL 来执行。验证过程中我们会将 Cache 关闭,分别统计 P75、P90、P99 的查询耗时。在这过程中,我们会发现有部分查询的性能没有达到要求,之后我们会做性能分析。Druid 引擎本身没有比较完善的性能分析工具,不能够很好的打印出它的执行计划以及各个算子的耗时,所以我们采用了第三方的 Arthas 火焰图进行分析。定位了相应的算子后,最终我们通过优化我们建表导数的逻辑以及索引构建的逻辑,并主要通过调整 Segment 大小的同时加入物化视图的方法,进行一些参数的调整以此来优化性能。 准确性验证。我们将业务真实数据同时写 Hive 表和 Druid,之后跑 Hive SQL和 Druid SQL,来进行数据质量的校对。在这个过程中我们会发现例如 StringLast 函数等一些函数会在特定的场景下出现计算值不稳定的问题。
稳定性保障
上线阶段
OLAP测试阶段。在这个阶段中,业务的数据会接入到 Druid 之中,但是业务的真实查询还是通过原来的 MySQL 库。这个阶段主要会验证 Druid 引擎的数据质量和 Druid 集群的稳定性。 上线观察阶段。在这个阶段,业务的查询会切回到 Druid。同时旧的 MySQL 链路还没有下线,业务侧能够随时切回 MySQL 链路。 OLAP运行稳定阶段。我们会把 MySQL 旧的链路下线,做资源的回收。
>>> 问题总结
数据导入部分中,实时数据乱序为典型问题。 在数据准确性验证阶段发现 StringLast 的函数值不稳定。 Durid 没有一个高效的精准去重的函数。
OLAP2.0 完善期
>>> 业务需求分析
>>> 解决方案
Druid 对于复杂的数据结构支持度并不是很好。 Druid 虽然能够支持明细查询,但是 Druid 的明细查询和聚合查询得分成不同的表,这样就会额外的引入一系列的存储成本。
剩下的部分就是 POC 、上生产的步骤,这两个步骤和 OLAP1.0 阶段比较类似,所以在这里就不过多展开介绍。
OLAP3.0 成熟期
举一个 AB 实验的例子。从下图可以看到,例子中是需要把 AB 实验的一个数据和后面相应的司机与用户的埋点数据关联到一起并做分析。在这种情况下,我们就会发现之前的两种工具都会存在一系列的弊端。
>>> 解决方案
技术调研
图5.3 OLAP3.0 技术调研
接下来我们对 Doris 进行了调研,我们发现 Doris 是能够支持小表的 Join,对大表的话也同样能够支持基于 Shuffle 的 Join,对于复杂数据类型(Array、JSon)的支持,经过跟 Apache Doris 社区沟通,预计将在 2022 年 7 月份的新版本中发布。通过在多个维度和需求满足度上进行对比,我们最终选择了 Apache Doris,也是因为 Apache Doris 的 SQL 支持度非常完善。
POC 阶段
稳定性保障
下面是我们的监控图,主要是关于 Compaction 相关的一些监控,感兴趣的同学可以看看。(文末 QA 环节有部分讲解)
>>> 问题总结
>>> 参数优化
打开 Profile。Doris 对于查询的性能分析具有非常好的 Profile 文件,这一点是非常赞的!我们可以看到各个算子在每一个阶段查询耗时以及数据处理量,这方面相比于 Druid 来说是非常便捷的! 调大单个查询的内存限制,同时把 BE 上的执行个数由 1 个调整成为 8 个,并且增加了 Compaction 在单个磁盘下的数据量。对于 Stream Load,我们把 Json 格式的最大的内存由 100 兆调整成为 150 兆,增大了 Rowset 内 Segment 的数量,并且开启了 SQL 级和 Partition 级的缓存。
数据流中,我们在 Flink 中做的事情已经很少了,经过数据简单的 ETL 后就可以把数据直接灌入到 Doris。经过 Doris 一系列的聚合计算、union 计算以及多表关联计算之后,业务侧就可以直接查询 Doris 来获取相关数据。
总结与思考
思考:我们认为很难有单个引擎能够富含各种场景。因此在技术选型时,需要针对于需求特点和引擎特点进行合理选择。
后续规划
内核演进方面:我们发现 Doris 基本能够覆盖 Druid 所有场景,因此后续计划以 Doris 引擎为主,Clickhous 引擎为辅,逐渐将 Druid 的相关业务向 Doris 迁移。
Q&A 环节
Q:刚才讲到了后续要从 Druid 引擎迁移到 Doris,要实现迁移的成本有多大呢?
例如我们这边的很多涉及到大表 Join 的查询,涉及的分区数据量大概在 10 亿量别,业务侧对于查询性能要求是 5 秒以内,通过 Doris 是可以满足我们需求的。如果是实时特征这种业务,是否能达到 200 毫秒可能需要经过一轮实际测试才能得到结果。
资料下载
点击下方名片,关注「SelectDB」
加入社区
欢迎热爱开源的小伙伴加入 Apache Doris 社区,除了可以在 GitHub 上提 PR 或 Issue,也欢迎大家积极参与到社区日常建设中来,比如:
最后,欢迎更多的开源技术爱好者加入 Apache Doris 社区,携手成长,共建社区生态。
相关链接:
SelectDB 官方网站:
https://selectdb.com (We Are Coming Soon)
Apache Doris 官方网站:
http://doris.apache.org
Apache Doris Github:
https://github.com/apache/doris
Apache Doris 开发者邮件组:
dev@doris.apache.org